/**
 * 2017年5月22日
 */
package org.textplantform.common.core;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.springframework.util.StringUtils;
import org.textplantform.common.Constant;
import org.textplantform.common.provider.LabelManagerService;
import org.textplantform.common.util.SerializationUtils;


/**
 * 类标名称管理器
 * 一个网络输出的结果应该是一个向量,(向量长度应该与这个类里面labels里面元素个数相相等,所以训练网络的时候需要更新这里面的数据.)
 * 这个向量代表了每个类的概率
 * 每个类名是什么
 * 就是用这个类来对应上
 * @author Alex
 *
 */
public class TextLabelManager extends LoggerSupport implements LabelManagerService {
	private List<String> labels;
	public TextLabelManager() {
		try{
			String path = System.getProperty(Constant.Keys.LabelManagerSaveKey);
			if(StringUtils.hasText(path)){
				labels = SerializationUtils.<List<String>>readObject(new File(path));
			}else{
				labels = SerializationUtils.<List<String>>readObject(this.getClass().getClassLoader().getResourceAsStream("data/"+Constant.Values.LabelsFileName));
			}
			logger.info("加载的类标列表: {}" + labels);
		}catch(Exception e){
			logException(e);
			throw new RuntimeException(e);
		}
	}
	public synchronized TextLabelManager setLabels(List<String> labels){
		this.labels = new ArrayList<String>(labels);
		logger.info("设置新的类标 :{}"+labels);
		return this;
	}
	public synchronized TextLabelManager saveLabels(){
		try{
			SerializationUtils.saveObject(labels, new File(System.getProperty(Constant.Keys.LabelManagerSaveKey)));
			logger.info(" {} 保存类标文件到bin,类标是{}:)",new Date(),labels);
		}catch(Exception e){
			logException(e);
		}
		return this;
	}
	
//	public static synchronized TextCategorizationManager restore(){
//		try{
//			TextCategorizationManager tcm = SerializationUtils.<TextCategorizationManager>readObject(new File(""));
//			if(inst==null) inst = tcm;
//			if(inst.labels == null){
//				inst.labels = tcm.labels;
//			}
//			return inst;
//		}catch(Exception e){
//			e.printStackTrace();
//		}
//		return inst;
//	}
//	
//	public ClassificationPair[] getDesc(INDArray arr){
//		ClassificationPair res [] = new ClassificationPair[this.labels.size()];
//		for(int i=0;i<res.length;i++){
//			res[i] = new ClassificationPair(this.labels.get(i), arr.getDouble(i));
//		}
//		Arrays.<ClassificationPair>sort(res,(x,y)->{
//			double t = y.val-x.val;
//			return t>0?1:(t<0?-1:0);
//		});
//		return res;
//	}
	public boolean checkLabel(String label){
		return this.labels.contains(label);
	}
	
//	public static TextCategorizationManager get(){
//		if(inst == null){
//			synchronized (TextCategorizationManager.class) {
//				if(inst == null){
//					inst =  new TextCategorizationManager();
//				}
//			}
//		}
//		return inst;
//	}
	/**
	 * 用来产生类标文件
	 * @param args
	 */
	public static void main(String args[]){
		List<String >lables = new ArrayList<>();
		File fs[] = new File("D:\\Share\\answer").listFiles();
		for(File f:fs){
			lables.add(f.getName());
		}
		Collections.sort(lables);
		SerializationUtils.saveObject(lables, new File("D:\\textdata\\deep4jdata\\labels_arr.bin"));
	}
	public String[] getLabels() {
		return labels.toArray(new String[labels.size()]);
	}
	
}
